package cn.kgc.springmvc.controller;

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.kgc.springmvc.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * @author: mosin
 * @version: v1.0  2022/10/23
 */
@RestController
@RequestMapping("excel")
public class UserController {


    //数据的批量导入  字段名 和 类中的属性名 保持一致
    @RequestMapping("import")
    public Object importExcel(@RequestParam("file") MultipartFile multipartFile) {

        HashMap<String, Object> map = new HashMap<>();

        //  数据的批量导入   解析excel文档  -> User  Bean
        try {
            if (!multipartFile.isEmpty()){
                InputStream inputStream = multipartFile.getInputStream();
                ExcelReader reader = ExcelUtil.getReader(inputStream);
                //  通过 ExcelReader  解析excel文件
                List<User> users = reader.read(1, 2, User.class);
                for (User user : users) {
                    System.out.println("user = " + user);
                }

                map.put("code", 200);
                map.put("msg", "数据批量导入成功");
                // 调用业务层实现数据的持久化  users  ->mysql
            }
        } catch (IOException e) {
            map.put("code", 500);
            map.put("msg", "数据批量导入失败");
            e.printStackTrace();
        }
        return map;
    }


    @RequestMapping("import2")
    public Object importExcel2(@RequestParam("file") MultipartFile multipartFile) {

        HashMap<String, Object> map = new HashMap<>();
        //  数据的批量导入   解析excel文档  -> User  Bean
        try {
            if (!multipartFile.isEmpty()){
                InputStream inputStream = multipartFile.getInputStream();
                ExcelReader reader = ExcelUtil.getReader(inputStream);
                //  通过 ExcelReader  解析excel文件
                List<List<Object>> read = reader.read(2);
                ArrayList<User> users = new ArrayList<>();
                //   List<Object>  - >  User
                for (List<Object> row : read) {
                    String username = row.get(0).toString();
                    String password = row.get(1).toString();
                    String strBirth = row.get(2).toString().toString();   // Date   string  -> Date
                    Date birth = new SimpleDateFormat("yyyy-MM-dd").parse(strBirth);
                    User user = new User(username, password, birth);
                    users.add(user);
                }

                for (User user : users) {
                    System.out.println("user = " + user);
                }

                map.put("code", 200);
                map.put("msg", "数据批量导入成功");
                // 调用业务层实现数据的持久化  users  ->mysql
            }
        } catch (Exception e) {
            map.put("code", 500);
            map.put("msg", "数据批量导入失败");
            e.printStackTrace();
        }
        return map;
    }
    //数据的批量导出
    @RequestMapping("export")
    public void exportExcel(HttpServletResponse response) {

        // 调用业务层 查询数据 -> 数据的导出
        ArrayList<User> users = new ArrayList<>();

        for (int i = 1; i < 11; i++) {
            User user = new User();
            user.setPassword("12345" + i);
            user.setBirth(new Date());
            user.setUsername("张" + i);
            users.add(user);
        }


        // 使用工具类 将数据导出到 excel
        ExcelWriter writer = ExcelUtil.getWriter();

        // 设置表格的标题
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(2, "用户信息表");

        //  字段名  ？
        writer.addHeaderAlias("username", "用户名");
        writer.addHeaderAlias("password", "密码");
        writer.addHeaderAlias("birth", "出生日期");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        try {
            // 一次性写出内容，使用默认样式，强制输出标题  wokeBook
            writer.write(users, true);
            //response为HttpServletResponse对象   设置下载文件时excel表格形式
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码   以附件形式进行打开   下载   URLEncoder 设置统一资源定位符的编码格式 解决下载文件中文名字乱码问题
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息表.xls", "utf-8"));

            ServletOutputStream out = response.getOutputStream();
            // 将导出的数据以响应流的形式 响应到前端
            writer.flush(out, true);
            // 关闭writer，释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
